package com.lancoo.edu.platform.operation.commons.controller.sys;

import com.alibaba.fastjson.JSONObject;
import com.lancoo.edu.platform.operation.commons.dto.BaseResult;
import com.lancoo.edu.platform.operation.commons.service.bo.sys.FileBoService;
import com.lancoo.edu.platform.operation.commons.annotation.CheckToken;
import com.lancoo.edu.platform.operation.commons.controller.base.BaseResultController;
import lombok.AllArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.List;

/**
 * @author lzh
 * 文件【响应】控制器
 */
@RestController
@AllArgsConstructor
@RequestMapping(value = "api/commons/file")
public class FileController extends BaseResultController {

    private final FileBoService fileBoService;

    /**
     * 批量文件上传
     *8
     * @param files 文件列表
     * @param modelName 模块名（文件名）
     * @return 文件信息
     */
    @PostMapping(value = "batch/upload")
    @CheckToken
    public BaseResult batchUpload(List<MultipartFile> files, String modelName) throws Exception {
        // 数据校验
        if (CollectionUtils.isEmpty(files) || StringUtils.isBlank(modelName)) {
            return error("文件和模块名称都不可为空");
        }
        // 批量保存文件
        return success(fileBoService.batchSave(files, modelName));
    }

    /**
     * 通用文件上传（单个）
     *
     * @param file      文件
     * @param modelName 模块名，如通知公告为“notice”
     * @return BaseResult2 文件信息
     * @throws Exception 除了ServiceException，其他都为代码错误导致的
     */
    @PostMapping(path = "/upload")
    public BaseResult uploadFile(MultipartFile file, String modelName) throws Exception {
        // 数据校验
        if (file == null || StringUtils.isBlank(modelName)) {
            return error("文件和模块名称都不可为空");
        }
        List<MultipartFile> files = Collections.singletonList(file);
        // 批量保存文件
        return success(fileBoService.batchSave(files, modelName));
    }

    /**
     * 获取富文本框配置信息
     * @return 富文本编辑器配置信息
     */
    @GetMapping(value = "editor/config")
    public BaseResult getConfig() throws Exception {
        // 读取 resources 下的 config.json 文件
        Resource resource = new ClassPathResource("config.json");
        InputStream is = resource.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        // 每行的字符串
        String lineStr;
        // 全部文件的数据
        StringBuilder data = new StringBuilder();
        while((lineStr = br.readLine()) != null) {
            System.out.println(lineStr);
            data.append(lineStr);
        }
        br.close();
        isr.close();
        is.close();
        return success(JSONObject.parseObject(data.toString()));
    }

}
